package xuan.controller.bazi;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xuan.configuration.result.ResponseResult;
import xuan.configuration.result.ResponseResultEnum;
import xuan.dto.bazi.*;
import xuan.dto.bazi.encapsulation.DaYunLiuNianEncapsulationVo;
import xuan.utils.bazi.BaZi;
import xuan.utils.bazi.BaZiMap;
import xuan.utils.bazi.BaZiSetting;
import xuan.utils.bazi.BaZiUtil;
import xuan.utils.bazi.utils.BaZiDaYunLiuNianUtil;
import xuan.utils.bazi.utils.BaZiShenShaUtil;
import xuan.utils.CommonUtil;
import xuan.utils.DateUtil;
import xuan.vo.bazi.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 八字排盘Controller
 *
 * @author 善待
 */
@RestController
@RequestMapping("/baZi")
public class BaZiController {

    /**
     * 开始排盘
     *
     * @param dto 八字设置接收类
     * @return 八字数据
     */
    @PostMapping("/paiPan")
    public ResponseResult<BaZiVo> paiPan(@RequestBody BaZiDto dto) {

        // 1、拷贝设置
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);

        // 2、排盘
        BaZi baZi = new BaZi(setting);

        // 3、拷贝数据
        BaZiVo vo = new BaZiVo();
        BeanUtils.copyProperties(baZi, vo);

        // 4、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }

    /**
     * 大运流年初始化
     *
     * @param dto 八字设置接收类
     * @return 八字数据
     */
    @PostMapping("/daYunInitialize")
    public ResponseResult<BaZiInitializeDaYunVo> daYunInitialize(@RequestBody BaZiDaYunInitializeDto dto) {

        Map<String, String> shiShenMap = BaZiMap.SHI_SHEN; // 十神（日干+其他干支为键）
        Map<String, List<String>> diZhiCangGanMap = BaZiMap.DI_ZHI_CANG_GAN; // 地支藏干（地支为键）
        Map<String, String> shiErZhangShengMap = BaZiMap.SHI_ER_ZHANG_SHENG; // 十二长生（日干+地支为键）
        Map<String, String> kongWangMap = BaZiMap.KONG_WANG; // 空亡（干支为键）
        Map<String, String> naYinMap = BaZiMap.NA_YIN; // 纳音（干支为键）

        // 1、处理数据
        String yearGanZhi = dto.getYearGan() + dto.getYearZhi(); // 年干支
        String monthGanZhi = dto.getMonthGan() + dto.getMonthZhi(); // 月干支
        String dayGanZhi = dto.getDayGan() + dto.getDayZhi(); // 日干支
        String hourGanZhi = dto.getHourGan() + dto.getHourZhi(); // 时干支

        // 2.1、计算大运数据、流年数据、小运数据、流月数据
        BaZiDaYunLiuNianUtil dyUtil = new BaZiDaYunLiuNianUtil(dto.getDayGan(), dto.getSex(), dto.getQiYunLiuPai(), dto.getSolarDate());
        dyUtil.daYun();// 计算大运数据
        dyUtil.liuNian(1); // 计算流年数据
        dyUtil.xiaoYun(1); // 计算小运数据
        dyUtil.liuYue(1, 1, dto.getSolarDate().getYear() + 1900); // 计算流月数据
        List<List<String>> daYun = dyUtil.getDaYun();// 获取大运数据
        List<List<String>> liuNian = dyUtil.getLiuNian(); // 获取流年数据
        List<List<String>> xiaoYun = dyUtil.getXiaoYun(); // 获取小运数据
        List<List<String>> liuYue = dyUtil.getLiuYue(); // 获取流月数据
        // 2.2、数据封装
        List<DaYunLiuNianEncapsulationVo> daYunPackage = DaYunLiuNianEncapsulationVo.daYunEncapsulation(daYun); // 大运封装
        List<DaYunLiuNianEncapsulationVo> liuNianPackage = DaYunLiuNianEncapsulationVo.liuNianEncapsulation(liuNian); // 流年封装
        List<DaYunLiuNianEncapsulationVo> xiaoYunPackage = DaYunLiuNianEncapsulationVo.xiaoYunEncapsulation(xiaoYun); // 小运封装
        List<DaYunLiuNianEncapsulationVo> liuYuePackage = DaYunLiuNianEncapsulationVo.liuYueEncapsulation(liuYue); // 流月封装

        // 3、处理大运干支、流年干支
        String daYunGanZhi = ""; // 大运干支
        String daYunGan = "";  // 大运干
        String daYunZhi = "";  // 大运支
        String liuNianGanZhi = ""; // 流年干支
        String liuNianGan = "";  // 流年干
        String liuNianZhi = "";  // 流年支
        if (xiaoYun.size() != 0) {
            daYunGanZhi = xiaoYun.get(0).get(0);
        } else {
            daYunGanZhi = daYun.get(1).get(0);
        }
        if (daYun.size() != 0) {
            liuNianGanZhi = liuNian.get(0).get(0);
        }
        if (StringUtils.isNotBlank(daYunGanZhi) && daYunGanZhi.length() >= 1) daYunGan = daYunGanZhi.substring(0, 1);
        if (StringUtils.isNotBlank(daYunGanZhi) && daYunGanZhi.length() >= 2) daYunZhi = daYunGanZhi.substring(1, 2);
        if (StringUtils.isNotBlank(liuNianGanZhi) && liuNianGanZhi.length() >= 1) liuNianGan = liuNianGanZhi.substring(0, 1);
        if (StringUtils.isNotBlank(liuNianGanZhi) && liuNianGanZhi.length() >= 2) liuNianZhi = liuNianGanZhi.substring(1, 2);

        // 4、计算命盘
        // 4.1、计算主星
        String daYunZhuXing = shiShenMap.get(dto.getDayGan() + daYunGan);// 大运主星
        String liuNianZhuXing = shiShenMap.get(dto.getDayGan() + liuNianGan); // 流年主星
        // 4.2、计算藏干
        List<String> daYunCangGan = diZhiCangGanMap.get(daYunZhi); // 大运藏干
        List<String> liuNianCangGan = diZhiCangGanMap.get(liuNianZhi); // 流年藏干
        // 4.3、计算副星
        List<String> daYunFuXing = new ArrayList<>();
        List<String> liuNianFuXing = new ArrayList<>();
        for (String cangGan : daYunCangGan) {
            daYunFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 大运副星
        }
        for (String cangGan : liuNianCangGan) {
            liuNianFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 流年副星
        }
        // 4.4、计算自坐
        String daYunZiZuo = shiErZhangShengMap.get(daYunGanZhi); // 大运自坐
        String liuNianZiZuo = shiErZhangShengMap.get(liuNianGanZhi); // 流年自坐
        // 4.5、计算星运
        String daYunXingYun = shiErZhangShengMap.get(dto.getDayGan() + daYunZhi); // 大运星运
        String liuNianXingYun = shiErZhangShengMap.get(dto.getDayGan() + liuNianZhi); // 流年星运
        // 4.6、计算空亡
        String daYunKongWang = kongWangMap.get(daYunGanZhi); // 大运空亡
        String liuNianKongWang = kongWangMap.get(liuNianGanZhi); // 流年空亡
        // 4.7、计算纳音
        String daYunNaYin = naYinMap.get(daYunGanZhi); // 大运纳音
        String liuNianNaYin = naYinMap.get(liuNianGanZhi); // 流年纳音
        // 4.8、计算神煞
        BaZiShenShaUtil ssUtil = new BaZiShenShaUtil(dto.getSex(), dto.getSeason(), dto.getYearGanZhiNaYin(), yearGanZhi, monthGanZhi, dayGanZhi, hourGanZhi, daYunGanZhi, liuNianGanZhi, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> daYunShenSha = ssUtil.getDaYunShenSha(); // 大运神煞
        List<String> liuNianShenSha = ssUtil.getLiuNianShenSha(); // 流年神煞

        // 5、计算干支留意
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);
        List<String> tianGanLiuYi = BaZiUtil.tanGanLiuYi(dto.getYearGan(), dto.getMonthGan(), dto.getDayGan(), dto.getHourGan(), daYunGan, liuNianGan, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> diZhiLiuYi = BaZiUtil.diZhiLiuYi(dto.getYearZhi(), dto.getMonthZhi(), dto.getDayZhi(), dto.getHourZhi(), daYunZhi, liuNianZhi, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);

        // 6、封装数据
        BaZiInitializeDaYunVo vo = new BaZiInitializeDaYunVo();
        vo.setDaYun(daYunPackage); // 大运
        vo.setLiuNian(liuNianPackage); // 流年
        vo.setXiaoYun(xiaoYunPackage); // 小运
        vo.setLiuYue(liuYuePackage); // 流月
        vo.setDaYunZhuXing(daYunZhuXing); // 大运主星
        vo.setLiuNianZhuXing(liuNianZhuXing); // 流年主星
        vo.setDaYunGanZhi(daYunGanZhi); // 大运干支
        vo.setLiuNianGanZhi(liuNianGanZhi); // 流年干支
        vo.setDaYunCangGan(daYunCangGan); // 大运藏干
        vo.setLiuNianCangGan(liuNianCangGan); // 流年藏干
        vo.setDaYunFuXing(daYunFuXing); // 大运副星
        vo.setLiuNianFuXing(liuNianFuXing); // 流年副星
        vo.setDaYunZiZuo(daYunZiZuo); // 大运自坐
        vo.setLiuNianZiZuo(liuNianZiZuo); // 流年自坐
        vo.setDaYunXingYun(daYunXingYun); // 大运星运
        vo.setLiuNianXingYun(liuNianXingYun); // 流年星运
        vo.setDaYunKongWang(daYunKongWang); // 大运空亡
        vo.setLiuNianKongWang(liuNianKongWang); // 流年空亡
        vo.setDaYunNaYin(daYunNaYin); // 大运纳音
        vo.setLiuNianNaYin(liuNianNaYin); // 流年纳音
        vo.setDaYunShenSha(daYunShenSha); // 大运神煞
        vo.setLiuNianShenSha(liuNianShenSha); // 流年神煞
        vo.setTianGanLiuYi(tianGanLiuYi); // 天干留意
        vo.setDiZhiLiuYi(diZhiLiuYi); // 地支留意

        // 7、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }

    /**
     * 点击大运
     *
     * @param dto 大运切换设置接收类
     * @return 大运流年数据
     */
    @PostMapping("/daYun")
    public ResponseResult<BaZiDaYunVo> daYun(@RequestBody BaZiDaYunDto dto) {

        Map<String, String> shiShenMap = BaZiMap.SHI_SHEN; // 十神（日干+其他干支为键）
        Map<String, List<String>> diZhiCangGanMap = BaZiMap.DI_ZHI_CANG_GAN; // 地支藏干（地支为键）
        Map<String, String> shiErZhangShengMap = BaZiMap.SHI_ER_ZHANG_SHENG; // 十二长生（日干+地支为键）
        Map<String, String> kongWangMap = BaZiMap.KONG_WANG; // 空亡（干支为键）
        Map<String, String> naYinMap = BaZiMap.NA_YIN; // 纳音（干支为键）

        // 1、处理数据
        String yearGanZhi = dto.getYearGan() + dto.getYearZhi(); // 年干支
        String monthGanZhi = dto.getMonthGan() + dto.getMonthZhi(); // 月干支
        String dayGanZhi = dto.getDayGan() + dto.getDayZhi(); // 日干支
        String hourGanZhi = dto.getHourGan() + dto.getHourZhi(); // 时干支
        String daYunGanZhi = dto.getDaYunGan() + dto.getDaYunZhi(); // 大运干支

        // 2.1、计算流年数据、小运数据、流月数据
        BaZiDaYunLiuNianUtil dylnUtil = new BaZiDaYunLiuNianUtil(dto.getDayGan(), dto.getSex(), dto.getQiYunLiuPai(), dto.getSolarDate());
        dylnUtil.daYun(); // 计算大运数据
        dylnUtil.liuNian(dto.getDaYunLun()); // 计算流年数据
        dylnUtil.xiaoYun(dto.getDaYunLun()); // 计算小运数据
        Date daYunSolarDate = DateUtil.stringToDate(dto.getDaYunSolarDate()); // 大运公历日期
        dylnUtil.liuYue(dto.getDaYunLun(), dto.getLiuNianLun(), daYunSolarDate.getYear() + 1900); // 计算流月数据
        List<List<String>> liuNian = dylnUtil.getLiuNian(); // 获取流年数据
        List<List<String>> xiaoYun = dylnUtil.getXiaoYun(); // 获取小运数据
        List<List<String>> liuYue = dylnUtil.getLiuYue(); // 获取流月数据
        // 2.2、数据封装
        List<DaYunLiuNianEncapsulationVo> liuNianPackage = DaYunLiuNianEncapsulationVo.liuNianEncapsulation(liuNian); // 流年封装
        List<DaYunLiuNianEncapsulationVo> xiaoYunPackage = DaYunLiuNianEncapsulationVo.xiaoYunEncapsulation(xiaoYun); // 小运封装
        List<DaYunLiuNianEncapsulationVo> liuYuePackage = DaYunLiuNianEncapsulationVo.liuYueEncapsulation(liuYue); // 流月封装

        // 3、处理流年干支
        String liuNianGan = ""; // 流年干
        String liuNianZhi = ""; // 流年支
        String liuNianGanZhi = liuNian.get(dto.getLiuNianLun() - 1).get(0); // 流年干支
        if (StringUtils.isNotBlank(liuNianGanZhi) && liuNianGanZhi.length() >= 1) liuNianGan = liuNianGanZhi.substring(0, 1); // 流年干
        if (StringUtils.isNotBlank(liuNianGanZhi) && liuNianGanZhi.length() >= 2) liuNianZhi = liuNianGanZhi.substring(1, 2); // 流年支

        // 4、计算命盘
        // 4.1、计算主星
        String daYunZhuXing = shiShenMap.get(dto.getDayGan() + dto.getDaYunGan()); // 大运主星
        String liuNianZhuXing = shiShenMap.get(dto.getDayGan() + liuNianGan); // 流年主星
        // 4.2、计算藏干
        List<String> daYunCangGan = diZhiCangGanMap.get(dto.getDaYunZhi()); // 大运藏干
        List<String> liuNianCangGan = diZhiCangGanMap.get(liuNianZhi); // 流年藏干
        // 4.3、计算副星
        List<String> daYunFuXing = new ArrayList<>();
        List<String> liuNianFuXing = new ArrayList<>();
        for (String cangGan : daYunCangGan) {
            daYunFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 大运副星
        }
        for (String cangGan : liuNianCangGan) {
            liuNianFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 流年副星
        }
        // 4.4、计算自坐
        String daYunZiZuo = shiErZhangShengMap.get(dto.getDaYunGan() + dto.getDaYunZhi()); // 大运自坐
        String liuNianZiZuo = shiErZhangShengMap.get(liuNianGan + liuNianZhi); // 流年自坐
        // 4.5、计算星运
        String daYunXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getDaYunZhi()); // 大运星运
        String liuNianXingYun = shiErZhangShengMap.get(dto.getDayGan() + liuNianZhi); // 流年星运
        // 4.6、计算空亡
        String daYunKongWang = kongWangMap.get(daYunGanZhi); // 大运空亡
        String liuNianKongWang = kongWangMap.get(liuNianGanZhi); // 流年空亡
        // 4.7、计算纳音
        String daYunNaYin = naYinMap.get(daYunGanZhi); // 大运纳音
        String liuNianNaYin = naYinMap.get(liuNianGanZhi); // 流年纳音
        // 4.8、计算神煞
        BaZiShenShaUtil ssUtil = new BaZiShenShaUtil(dto.getSex(), dto.getSeason(), dto.getYearGanZhiNaYin(), yearGanZhi, monthGanZhi, dayGanZhi, hourGanZhi, daYunGanZhi, liuNianGanZhi, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> daYunShenSha = ssUtil.getDaYunShenSha(); // 大运神煞
        List<String> liuNianShenSha = ssUtil.getLiuNianShenSha(); // 流年神煞

        // 5、计算干支留意
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);
        List<String> tianGanLiuYi = BaZiUtil.tanGanLiuYi(dto.getYearGan(), dto.getMonthGan(), dto.getDayGan(), dto.getHourGan(), dto.getHourGan(), dto.getDaYunGan(), CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> diZhiLiuYi = BaZiUtil.diZhiLiuYi(dto.getYearZhi(), dto.getMonthZhi(), dto.getDayZhi(), dto.getHourZhi(), dto.getHourZhi(), dto.getDaYunZhi(), CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);

        // 6、封装数据
        BaZiDaYunVo vo = new BaZiDaYunVo();
        vo.setLiuNian(liuNianPackage); // 流年
        vo.setXiaoYun(xiaoYunPackage); // 小运
        vo.setLiuYue(liuYuePackage); // 流月
        vo.setDaYunZhuXing(daYunZhuXing); // 大运主星
        vo.setLiuNianZhuXing(liuNianZhuXing); // 流年主星
        vo.setDaYunGanZhi(daYunGanZhi); // 大运干支
        vo.setLiuNianGanZhi(liuNianGanZhi); // 流年干支
        vo.setDaYunCangGan(daYunCangGan); // 大运藏干
        vo.setLiuNianCangGan(liuNianCangGan); // 流年藏干
        vo.setDaYunFuXing(daYunFuXing); // 大运副星
        vo.setLiuNianFuXing(liuNianFuXing); // 流年副星
        vo.setDaYunZiZuo(daYunZiZuo); // 大运自坐
        vo.setLiuNianZiZuo(liuNianZiZuo); // 流年自坐
        vo.setDaYunXingYun(daYunXingYun); // 大运星运
        vo.setLiuNianXingYun(liuNianXingYun); // 流年星运
        vo.setDaYunKongWang(daYunKongWang); // 大运空亡
        vo.setLiuNianKongWang(liuNianKongWang); // 流年空亡
        vo.setDaYunNaYin(daYunNaYin); // 大运纳音
        vo.setLiuNianNaYin(liuNianNaYin); // 流年纳音
        vo.setDaYunShenSha(daYunShenSha); // 大运神煞
        vo.setLiuNianShenSha(liuNianShenSha); // 流年神煞
        vo.setTianGanLiuYi(tianGanLiuYi); // 天干留意
        vo.setDiZhiLiuYi(diZhiLiuYi); // 地支留意

        // 7、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }

    /**
     * 点击流年
     *
     * @param dto 流年切换设置接收类
     * @return 大运流年数据
     */
    @PostMapping("/liuNian")
    public ResponseResult<BaZiLiuNianVo> liuNian(@RequestBody BaZiLiuNianDto dto) {

        Map<String, String> shiShenMap = BaZiMap.SHI_SHEN; // 十神（日干+其他干支为键）
        Map<String, List<String>> diZhiCangGanMap = BaZiMap.DI_ZHI_CANG_GAN; // 地支藏干（地支为键）
        Map<String, String> shiErZhangShengMap = BaZiMap.SHI_ER_ZHANG_SHENG; // 十二长生（日干+地支为键）
        Map<String, String> kongWangMap = BaZiMap.KONG_WANG; // 空亡（干支为键）
        Map<String, String> naYinMap = BaZiMap.NA_YIN; // 纳音（干支为键）

        // 1、处理数据
        String yearGanZhi = dto.getYearGan() + dto.getYearZhi(); // 年干支
        String monthGanZhi = dto.getMonthGan() + dto.getMonthZhi(); // 月干支
        String dayGanZhi = dto.getDayGan() + dto.getDayZhi(); // 日干支
        String hourGanZhi = dto.getHourGan() + dto.getHourZhi(); // 时干支
        String daYunGanZhi = dto.getDaYunGan() + dto.getDaYunZhi(); // 大运干支
        String liuNianGanZhi = dto.getLiuNianGan() + dto.getLiuNianZhi(); // 流年干支

        // 2.1、计算流月数据
        BaZiDaYunLiuNianUtil dylnUtil = new BaZiDaYunLiuNianUtil(dto.getDayGan(), dto.getSex(), dto.getQiYunLiuPai(), dto.getSolarDate());
        dylnUtil.daYun(); // 计算大运数据
        dylnUtil.liuNian(dto.getDaYunLun()); // 计算流年数据
        Date liuNianXiaoYunSolarDate = DateUtil.stringToDate(dto.getLiuNianSolarDate()); // 流年公历日期
        dylnUtil.liuYue(dto.getDaYunLun(), dto.getLiuNianLun(), liuNianXiaoYunSolarDate.getYear() + 1900); // 计算流月数据
        List<List<String>> liuYue = dylnUtil.getLiuYue(); // 获取流月数据
        // 2.2、数据封装
        List<DaYunLiuNianEncapsulationVo> liuYuePackage = DaYunLiuNianEncapsulationVo.liuYueEncapsulation(liuYue); // 流月封装

        // 3、计算命盘数据
        // 3.1、计算主星
        String daYunZhuXing = shiShenMap.get(dto.getDayGan() + dto.getDaYunGan()); // 大运主星
        String liuNianZhuXing = shiShenMap.get(dto.getDayGan() + dto.getLiuNianGan()); // 流年主星
        // 3.2、计算藏干
        List<String> daYunCangGan = diZhiCangGanMap.get(dto.getDaYunZhi()); // 大运藏干
        List<String> liuNianCangGan = diZhiCangGanMap.get(dto.getLiuNianZhi()); // 流年藏干
        // 3.3、计算副星
        List<String> daYunFuXing = new ArrayList<>();
        List<String> liuNianFuXing = new ArrayList<>();
        for (String cangGan : daYunCangGan) {
            daYunFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 大运副星
        }
        for (String cangGan : liuNianCangGan) {
            liuNianFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 流年副星
        }
        // 3.4、计算自坐
        String daYunZiZuo = shiErZhangShengMap.get(dto.getDaYunGan() + dto.getDaYunZhi()); // 大运自坐
        String liuNianZiZuo = shiErZhangShengMap.get(dto.getLiuNianGan() + dto.getLiuNianZhi()); // 流年自坐
        // 3.5、计算星运
        String daYunXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getDaYunZhi()); // 大运星运
        String liuNianXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getLiuNianZhi()); // 流年星运
        // 3.6、计算空亡
        String daYunKongWang = kongWangMap.get(daYunGanZhi); // 大运空亡
        String liuNianKongWang = kongWangMap.get(liuNianGanZhi); // 流年空亡
        // 3.7、计算纳音
        String daYunNaYin = naYinMap.get(daYunGanZhi); // 大运纳音
        String liuNianNaYin = naYinMap.get(liuNianGanZhi); // 流年纳音
        // 3.8、计算神煞
        BaZiShenShaUtil ssUtil = new BaZiShenShaUtil(dto.getSex(), dto.getSeason(), dto.getYearGanZhiNaYin(), yearGanZhi, monthGanZhi, dayGanZhi, hourGanZhi, daYunGanZhi, liuNianGanZhi, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> daYunShenSha = ssUtil.getDaYunShenSha(); // 大运神煞
        List<String> liuNianShenSha = ssUtil.getLiuNianShenSha(); // 流年神煞

        // 4、计算干支留意
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);
        List<String> tianGanLiuYi = BaZiUtil.tanGanLiuYi(dto.getYearGan(), dto.getMonthGan(), dto.getDayGan(), dto.getHourGan(), dto.getDaYunGan(), dto.getLiuNianGan(), CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> diZhiLiuYi = BaZiUtil.diZhiLiuYi(dto.getYearZhi(), dto.getMonthZhi(), dto.getDayZhi(), dto.getHourZhi(), dto.getDaYunZhi(), dto.getLiuNianZhi(), CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY);

        // 5、封装数据并返回
        BaZiLiuNianVo vo = new BaZiLiuNianVo();
        vo.setLiuYue(liuYuePackage); // 流月
        vo.setDaYunGanZhi(daYunGanZhi); // 大运干支
        vo.setLiuNianGanZhi(liuNianGanZhi); // 流年干支
        vo.setDaYunZhuXing(daYunZhuXing); // 大运主星
        vo.setLiuNianZhuXing(liuNianZhuXing); // 流年主星
        vo.setDaYunCangGan(daYunCangGan); // 大运藏干
        vo.setLiuNianCangGan(liuNianCangGan); // 流年藏干
        vo.setDaYunFuXing(daYunFuXing); // 大运副星
        vo.setLiuNianFuXing(liuNianFuXing); // 流年副星
        vo.setDaYunZiZuo(daYunZiZuo); // 大运自坐
        vo.setLiuNianZiZuo(liuNianZiZuo); // 流年自坐
        vo.setDaYunXingYun(daYunXingYun); // 大运星运
        vo.setLiuNianXingYun(liuNianXingYun); // 流年星运
        vo.setDaYunKongWang(daYunKongWang); // 大运空亡
        vo.setLiuNianKongWang(liuNianKongWang); // 流年空亡
        vo.setDaYunNaYin(daYunNaYin); // 大运纳音
        vo.setLiuNianNaYin(liuNianNaYin); // 流年纳音
        vo.setDaYunShenSha(daYunShenSha); // 大运神煞
        vo.setLiuNianShenSha(liuNianShenSha); // 流年神煞
        vo.setTianGanLiuYi(tianGanLiuYi); // 天干留意
        vo.setDiZhiLiuYi(diZhiLiuYi); // 地支留意

        // 6、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }

    /**
     * 点击流月
     *
     * @param dto 流月切换设置接收类
     * @return 大运流年数据
     */
    @PostMapping("/liuYue")
    public ResponseResult<BaZiLiuYueVo> liuYue(@RequestBody BaZiLiuYueDto dto) {

        Map<String, String> shiShenMap = BaZiMap.SHI_SHEN; // 十神（日干+其他干支为键）
        Map<String, List<String>> diZhiCangGanMap = BaZiMap.DI_ZHI_CANG_GAN; // 地支藏干（地支为键）
        Map<String, String> shiErZhangShengMap = BaZiMap.SHI_ER_ZHANG_SHENG; // 十二长生（日干+地支为键）
        Map<String, String> kongWangMap = BaZiMap.KONG_WANG; // 空亡（干支为键）
        Map<String, String> naYinMap = BaZiMap.NA_YIN; // 纳音（干支为键）

        // 1、处理数据
        String yearGanZhi = dto.getYearGan() + dto.getYearZhi(); // 年干支
        String monthGanZhi = dto.getMonthGan() + dto.getMonthZhi(); // 月干支
        String dayGanZhi = dto.getDayGan() + dto.getDayZhi(); // 日干支
        String hourGanZhi = dto.getHourGan() + dto.getHourZhi(); // 时干支
        String liuYueGanZhi = dto.getLiuYueGan() + dto.getLiuYueZhi(); // 流月干支

        // 2.1、计算流月数据
        BaZiDaYunLiuNianUtil dylnUtil = new BaZiDaYunLiuNianUtil(dto.getDayGan(), dto.getSex(), dto.getQiYunLiuPai(), dto.getSolarDate());
        Date liuYueSolarDate = DateUtil.stringToDate(dto.getLiuYueSolarDate()); // 流月公历日期
        dylnUtil.liuRi(liuYueSolarDate.getYear() + 1900, liuYueSolarDate.getMonth() + 1, dto.getJieQiSet()); // 计算流日数据
        List<List<String>> liuRi = dylnUtil.getLiuRi(); // 获取流日数据
        // 2.2、数据封装
        List<DaYunLiuNianEncapsulationVo> liuRiPackage = DaYunLiuNianEncapsulationVo.liuRiEncapsulation(liuRi); // 流日封装

        // 3、计算命盘
        // 3.1、计算主星
        String liuYueZhuXing = shiShenMap.get(dto.getDayGan() + dto.getLiuYueGan()); // 流月主星
        // 3.2、计算藏干
        List<String> liuYueCangGan = diZhiCangGanMap.get(dto.getLiuYueZhi()); // 流月藏干
        // 3.3、计算副星
        List<String> liuYueFuXing = new ArrayList<>();
        for (String cangGan : liuYueCangGan) {
            liuYueFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 流月副星
        }
        // 3.4、计算自坐
        String liuYueZiZuo = shiErZhangShengMap.get(dto.getLiuYueGan() + dto.getLiuYueZhi()); // 流月自坐
        // 3.5、计算星运
        String liuYueXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getLiuYueZhi()); // 流月星运
        // 3.6、计算空亡
        String liuYueKongWang = kongWangMap.get(liuYueGanZhi); // 流月空亡
        // 3.7、计算纳音
        String liuYueNaYin = naYinMap.get(liuYueGanZhi); // 流月纳音
        // 3.8、计算神煞
        BaZiShenShaUtil ssUtil = new BaZiShenShaUtil(dto.getSex(), dto.getSeason(), dto.getYearGanZhiNaYin(), yearGanZhi, monthGanZhi, dayGanZhi, hourGanZhi, CommonUtil.EMPTY, CommonUtil.EMPTY, liuYueGanZhi, CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> liuYueShenSha = ssUtil.getLiuYueShenSha(); // 流月神煞

        // 4、计算干支留意
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);
        List<String> tianGanLiuYi = BaZiUtil.tanGanLiuYi(dto.getYearGan(), dto.getMonthGan(), dto.getDayGan(), dto.getHourGan(), dto.getDaYunGan(), dto.getLiuNianGan(), dto.getLiuYueGan(), CommonUtil.EMPTY, CommonUtil.EMPTY);
        List<String> diZhiLiuYi = BaZiUtil.diZhiLiuYi(dto.getYearZhi(), dto.getMonthZhi(), dto.getDayZhi(), dto.getHourZhi(), dto.getDaYunZhi(), dto.getLiuNianZhi(), dto.getLiuYueZhi(), CommonUtil.EMPTY, CommonUtil.EMPTY);

        // 5、封装数据并返回
        BaZiLiuYueVo vo = new BaZiLiuYueVo();
        vo.setLiuRi(liuRiPackage); // 流日
        vo.setLiuYueZhuXing(liuYueZhuXing); // 流月主星
        vo.setLiuYueGanZhi(liuYueGanZhi); // 流月干支
        vo.setLiuYueCangGan(liuYueCangGan); // 流月藏干
        vo.setLiuYueFuXing(liuYueFuXing); // 流月副星
        vo.setLiuYueZiZuo(liuYueZiZuo); // 流月自坐
        vo.setLiuYueXingYun(liuYueXingYun); // 流月星运
        vo.setLiuYueKongWang(liuYueKongWang); // 流月空亡
        vo.setLiuYueNaYin(liuYueNaYin); // 流月纳音
        vo.setLiuYueShenSha(liuYueShenSha); // 流月神煞
        vo.setTianGanLiuYi(tianGanLiuYi); // 天干留意
        vo.setDiZhiLiuYi(diZhiLiuYi); // 地支留意

        // 6、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }

    /**
     * 点击流日
     *
     * @param dto 流日切换设置接收类
     * @return 大运流年数据
     */
    @PostMapping("/liuRi")
    public ResponseResult<BaZiLiuRiVo> liuRi(@RequestBody BaZiLiuRiDto dto) {

        Map<String, String> shiShenMap = BaZiMap.SHI_SHEN; // 十神（日干+其他干支为键）
        Map<String, List<String>> diZhiCangGanMap = BaZiMap.DI_ZHI_CANG_GAN; // 地支藏干（地支为键）
        Map<String, String> shiErZhangShengMap = BaZiMap.SHI_ER_ZHANG_SHENG; // 十二长生（日干+地支为键）
        Map<String, String> kongWangMap = BaZiMap.KONG_WANG; // 空亡（干支为键）
        Map<String, String> naYinMap = BaZiMap.NA_YIN; // 纳音（干支为键）

        // 1、处理数据
        String yearGanZhi = dto.getYearGan() + dto.getYearZhi(); // 年干支
        String monthGanZhi = dto.getMonthGan() + dto.getMonthZhi(); // 月干支
        String dayGanZhi = dto.getDayGan() + dto.getDayZhi(); // 日干支
        String hourGanZhi = dto.getHourGan() + dto.getHourZhi(); // 时干支
        String liuRiGanZhi = dto.getLiuRiGan() + dto.getLiuRiZhi(); // 流日干支

        // 2.1、计算流时数据
        BaZiDaYunLiuNianUtil dylnUtil = new BaZiDaYunLiuNianUtil(dto.getDayGan(), dto.getSex(), dto.getQiYunLiuPai(), dto.getSolarDate());
        Date liuRiSolarDate = DateUtil.stringToDate(dto.getLiuRiSolarDate()); // 流日公历日期
        dylnUtil.liuShi(liuRiSolarDate.getYear() + 1900, liuRiSolarDate.getMonth() + 1, liuRiSolarDate.getDate()); // 计算流时数据
        List<List<String>> liuShi = dylnUtil.getLiuShi(); // 获取流时数据
        // 2.2、数据封装
        List<DaYunLiuNianEncapsulationVo> liuShiPackage = DaYunLiuNianEncapsulationVo.liuShiEncapsulation(liuShi); // 流时封装

        // 3、计算命盘
        // 3.1、计算主星
        String liuRiZhuXing = shiShenMap.get(dto.getDayGan() + dto.getLiuRiGan()); // 流日主星
        // 3.2、计算藏干
        List<String> liuRiCangGan = diZhiCangGanMap.get(dto.getLiuRiZhi()); // 流日藏干
        // 3.3、计算副星
        List<String> liuRiFuXing = new ArrayList<>();
        for (String cangGan : liuRiCangGan) {
            liuRiFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 流日副星
        }
        // 3.4、计算自坐
        String liuRiZiZuo = shiErZhangShengMap.get(dto.getLiuRiGan() + dto.getLiuRiZhi()); // 流日自坐
        // 3.5、计算星运
        String liuRiXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getLiuRiZhi()); // 流日星运
        // 3.6、计算空亡
        String liuRiKongWang = kongWangMap.get(liuRiGanZhi); // 流日空亡
        // 3.7、计算纳音
        String liuRiNaYin = naYinMap.get(liuRiGanZhi); // 流日纳音
        // 3.8、计算神煞
        BaZiShenShaUtil ssUtil = new BaZiShenShaUtil(dto.getSex(), dto.getSeason(), dto.getYearGanZhiNaYin(), yearGanZhi, monthGanZhi, dayGanZhi, hourGanZhi, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY, liuRiGanZhi, CommonUtil.EMPTY);
        List<String> liuRiShenSha = ssUtil.getLiuRiShenSha(); // 流日神煞

        // 4、计算干支留意
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);
        List<String> tianGanLiuYi = BaZiUtil.tanGanLiuYi(dto.getYearGan(), dto.getMonthGan(), dto.getDayGan(), dto.getHourGan(), dto.getDaYunGan(), dto.getLiuNianGan(), dto.getLiuYueGan(), dto.getLiuRiGan(), CommonUtil.EMPTY);
        List<String> diZhiLiuYi = BaZiUtil.diZhiLiuYi(dto.getYearZhi(), dto.getMonthZhi(), dto.getDayZhi(), dto.getHourZhi(), dto.getDaYunZhi(), dto.getLiuNianZhi(), dto.getLiuYueZhi(), dto.getLiuRiZhi(), CommonUtil.EMPTY);

        // 5、封装数据并返回
        BaZiLiuRiVo vo = new BaZiLiuRiVo();
        vo.setLiuShi(liuShiPackage); // 流时
        vo.setLiuRiZhuXing(liuRiZhuXing); // 流日主星
        vo.setLiuRiGanZhi(liuRiGanZhi); // 流日干支
        vo.setLiuRiCangGan(liuRiCangGan); // 流日藏干
        vo.setLiuRiFuXing(liuRiFuXing); // 流日副星
        vo.setLiuRiZiZuo(liuRiZiZuo); // 流日自坐
        vo.setLiuRiXingYun(liuRiXingYun); // 流日星运
        vo.setLiuRiKongWang(liuRiKongWang); // 流日空亡
        vo.setLiuRiNaYin(liuRiNaYin); // 流日纳音
        vo.setLiuRiShenSha(liuRiShenSha); // 流日神煞
        vo.setTianGanLiuYi(tianGanLiuYi); // 天干留意
        vo.setDiZhiLiuYi(diZhiLiuYi); // 地支留意

        // 6、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }

    /**
     * 点击流时
     *
     * @param dto 流时切换设置接收类
     * @return 大运流年数据
     */
    @PostMapping("/liuShi")
    public ResponseResult<BaZiLiuShiVo> liuShi(@RequestBody BaZiLiuShiDto dto) {

        Map<String, String> shiShenMap = BaZiMap.SHI_SHEN; // 十神（日干+其他干支为键）
        Map<String, List<String>> diZhiCangGanMap = BaZiMap.DI_ZHI_CANG_GAN; // 地支藏干（地支为键）
        Map<String, String> shiErZhangShengMap = BaZiMap.SHI_ER_ZHANG_SHENG; // 十二长生（日干+地支为键）
        Map<String, String> kongWangMap = BaZiMap.KONG_WANG; // 空亡（干支为键）
        Map<String, String> naYinMap = BaZiMap.NA_YIN; // 纳音（干支为键）

        // 1、处理数据
        String yearGanZhi = dto.getYearGan() + dto.getYearZhi(); // 年干支
        String monthGanZhi = dto.getMonthGan() + dto.getMonthZhi(); // 月干支
        String dayGanZhi = dto.getDayGan() + dto.getDayZhi(); // 日干支
        String hourGanZhi = dto.getHourGan() + dto.getHourZhi(); // 时干支
        String liuShiGanZhi = dto.getLiuShiGan() + dto.getLiuShiZhi(); // 流时干支

        // 2、计算命盘
        // 2.1、计算主星
        String liuShiZhuXing = shiShenMap.get(dto.getDayGan() + dto.getLiuShiGan()); // 流时主星
        // 2.2、计算藏干
        List<String> liuShiCangGan = diZhiCangGanMap.get(dto.getLiuShiZhi()); // 流时藏干
        // 2.3、计算副星
        List<String> liuShiFuXing = new ArrayList<>();
        for (String cangGan : liuShiCangGan) {
            liuShiFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 流时副星
        }
        // 2.4、计算自坐
        String liuShiZiZuo = shiErZhangShengMap.get(dto.getLiuShiGan() + dto.getLiuShiZhi()); // 流时自坐
        // 2.5、计算星运
        String liuShiXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getLiuShiZhi()); // 流时星运
        // 2.6、计算空亡
        String liuShiKongWang = kongWangMap.get(liuShiGanZhi); // 流时空亡
        // 2.7、计算纳音
        String liuShiNaYin = naYinMap.get(liuShiGanZhi); // 流时纳音
        // 2.8、计算神煞
        BaZiShenShaUtil ssUtil = new BaZiShenShaUtil(dto.getSex(), dto.getSeason(), dto.getYearGanZhiNaYin(), yearGanZhi, monthGanZhi, dayGanZhi, hourGanZhi, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY, CommonUtil.EMPTY, liuShiGanZhi);
        List<String> liuShiShenSha = ssUtil.getLiuShiShenSha(); // 流时神煞

        // 3、计算干支留意
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);
        List<String> tianGanLiuYi = BaZiUtil.tanGanLiuYi(dto.getYearGan(), dto.getMonthGan(), dto.getDayGan(), dto.getHourGan(), dto.getDaYunGan(), dto.getLiuNianGan(), dto.getLiuYueGan(), dto.getLiuRiGan(), dto.getLiuShiGan());
        List<String> diZhiLiuYi = BaZiUtil.diZhiLiuYi(dto.getYearZhi(), dto.getMonthZhi(), dto.getDayZhi(), dto.getHourZhi(), dto.getDaYunZhi(), dto.getLiuNianZhi(), dto.getLiuYueZhi(), dto.getLiuRiZhi(), dto.getLiuShiZhi());

        // 4、封装数据并返回
        BaZiLiuShiVo vo = new BaZiLiuShiVo();
        vo.setLiuShiZhuXing(liuShiZhuXing); // 流时主星
        vo.setLiuShiGanZhi(liuShiGanZhi); // 流时干支
        vo.setLiuShiCangGan(liuShiCangGan); // 流时藏干
        vo.setLiuShiFuXing(liuShiFuXing); // 流时副星
        vo.setLiuShiZiZuo(liuShiZiZuo); // 流时自坐
        vo.setLiuShiXingYun(liuShiXingYun); // 流时星运
        vo.setLiuShiKongWang(liuShiKongWang); // 流时空亡
        vo.setLiuShiNaYin(liuShiNaYin); // 流时纳音
        vo.setLiuShiShenSha(liuShiShenSha); // 流时神煞
        vo.setTianGanLiuYi(tianGanLiuYi); // 天干留意
        vo.setDiZhiLiuYi(diZhiLiuYi); // 地支留意

        // 5、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }

    /**
     * 点击胎命身
     *
     * @param dto 胎命身切换设置接收类
     * @return 胎命身数据
     */
    @PostMapping("/taiMingShen")
    public ResponseResult<BaZiTaiMingShenVo> taiMingShen(@RequestBody BaZiTaiMingShenDto dto) {

        Map<String, String> shiShenMap = BaZiMap.SHI_SHEN; // 十神（日干+其他干支为键）
        Map<String, List<String>> diZhiCangGanMap = BaZiMap.DI_ZHI_CANG_GAN; // 地支藏干（地支为键）
        Map<String, String> shiErZhangShengMap = BaZiMap.SHI_ER_ZHANG_SHENG; // 十二长生（日干+地支为键）
        Map<String, String> kongWangMap = BaZiMap.KONG_WANG; // 空亡（干支为键）
        Map<String, String> naYinMap = BaZiMap.NA_YIN; // 纳音（干支为键）

        // 1、处理数据
        String yearGanZhi = dto.getYearGan() + dto.getYearZhi(); // 年干支
        String monthGanZhi = dto.getMonthGan() + dto.getMonthZhi(); // 月干支
        String dayGanZhi = dto.getDayGan() + dto.getDayZhi(); // 日干支
        String hourGanZhi = dto.getHourGan() + dto.getHourZhi(); // 时干支
        String tanYuanGanZhi = dto.getTaiYuanGan() + dto.getTaiYuanZhi(); // 胎元干支
        String tanXiGanZhi = dto.getTaiXiGan() + dto.getTaiXiZhi(); // 胎息干支
        String mingGongGanZhi = dto.getMingGongGan() + dto.getMingGongZhi(); // 命宫干支
        String shenGongGanZhi = dto.getShenGongGan() + dto.getShenGongZhi(); // 身宫干支

        // 2、计算胎元、胎息、命宫、身宫命盘数据
        // 2.1、计算主星
        String taiYuanZhuXing = shiShenMap.get(dto.getDayGan() + dto.getTaiYuanGan()); // 胎元主星
        String taiXiZhuXing = shiShenMap.get(dto.getDayGan() + dto.getTaiXiGan()); // 胎息主星
        String mingGongZhuXing = shiShenMap.get(dto.getDayGan() + dto.getMingGongGan()); // 命宫主星
        String shenGongZhuXing = shiShenMap.get(dto.getDayGan() + dto.getShenGongGan()); // 身宫主星
        // 2.2、计算藏干
        List<String> taiYuanCangGan = diZhiCangGanMap.get(dto.getTaiYuanZhi()); // 胎元藏干
        List<String> taiXiCangGan = diZhiCangGanMap.get(dto.getTaiXiZhi()); // 胎息藏干
        List<String> mingGongCangGan = diZhiCangGanMap.get(dto.getMingGongZhi()); // 命宫藏干
        List<String> shenGongCangGan = diZhiCangGanMap.get(dto.getShenGongZhi()); // 身宫藏干
        // 2.3、计算副星
        List<String> taiYuanFuXing = new ArrayList<>();
        List<String> taiXiFuXing = new ArrayList<>();
        List<String> mingGongFuXing = new ArrayList<>();
        List<String> shenGongFuXing = new ArrayList<>();
        for (String cangGan : taiYuanCangGan) {
            taiYuanFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 胎元副星
        }
        for (String cangGan : taiXiCangGan) {
            taiXiFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 胎息副星
        }
        for (String cangGan : mingGongCangGan) {
            mingGongFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 命宫副星
        }
        for (String cangGan : shenGongCangGan) {
            shenGongFuXing.add(shiShenMap.get(dto.getDayGan() + cangGan)); // 身宫副星
        }
        // 2.4、计算自坐
        String taiYuanZiZuo = shiErZhangShengMap.get(dto.getTaiYuanGan() + dto.getTaiYuanZhi()); // 胎元自坐
        String taiXiZiZuo = shiErZhangShengMap.get(dto.getTaiXiGan() + dto.getTaiXiZhi()); // 胎息自坐
        String mingGongZiZuo = shiErZhangShengMap.get(dto.getMingGongGan() + dto.getMingGongZhi()); // 命宫自坐
        String shenGongZiZuo = shiErZhangShengMap.get(dto.getShenGongGan() + dto.getShenGongZhi()); // 身宫自坐
        // 2.5、计算星运
        String taiYuanXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getTaiYuanZhi()); // 胎元星运
        String taiXiXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getTaiXiZhi()); // 胎息星运
        String mingGongXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getMingGongZhi()); // 命宫星运
        String shenGongXingYun = shiErZhangShengMap.get(dto.getDayGan() + dto.getShenGongZhi()); // 身宫星运
        // 2.6、计算空亡
        String taiYuanKongWang = kongWangMap.get(tanYuanGanZhi); // 胎元空亡
        String taiXiKongWang = kongWangMap.get(tanXiGanZhi); // 胎息空亡
        String mingGongKongWang = kongWangMap.get(mingGongGanZhi); // 命宫空亡
        String shenGongKongWang = kongWangMap.get(shenGongGanZhi); // 身宫空亡
        // 2.7、计算纳音
        String taiYuanNaYin = naYinMap.get(tanYuanGanZhi); // 胎元纳音
        String taiXiNaYin = naYinMap.get(tanXiGanZhi); // 胎息纳音
        String mingGongNaYin = naYinMap.get(mingGongGanZhi); // 命宫纳音
        String shenGongNaYin = naYinMap.get(shenGongGanZhi); // 身宫纳音
        // 2.8、计算神煞
        BaZiShenShaUtil ssUtil = new BaZiShenShaUtil(dto.getSex(), dto.getSeason(), dto.getYearGanZhiNaYin(), yearGanZhi, monthGanZhi, dayGanZhi, hourGanZhi, tanYuanGanZhi, tanXiGanZhi, mingGongGanZhi, shenGongGanZhi, CommonUtil.EMPTY);
        List<String> taiYuanShenSha = ssUtil.getDaYunShenSha(); // 胎元神煞
        List<String> taiXiShenSha = ssUtil.getLiuNianShenSha(); // 胎息神煞
        List<String> mingGongShenSha = ssUtil.getLiuYueShenSha(); // 命宫神煞
        List<String> shenGongShenSha = ssUtil.getLiuRiShenSha(); // 身宫神煞

        // 3、计算干支留意
        BaZiSetting setting = new BaZiSetting();
        BeanUtils.copyProperties(dto, setting);
        List<String> tianGanLiuYi = BaZiUtil.tanGanLiuYi(dto.getYearGan(), dto.getMonthGan(), dto.getDayGan(), dto.getHourGan(), dto.getTaiYuanGan(), dto.getTaiXiGan(), dto.getMingGongGan(), dto.getShenGongGan(), CommonUtil.EMPTY);
        List<String> diZhiLiuYi = BaZiUtil.diZhiLiuYi(dto.getYearZhi(), dto.getMonthZhi(), dto.getDayZhi(), dto.getHourZhi(), dto.getTaiYuanZhi(), dto.getTaiXiZhi(), dto.getMingGongZhi(), dto.getShenGongZhi(), CommonUtil.EMPTY);

        // 4、封装数据并返回
        BaZiTaiMingShenVo vo = new BaZiTaiMingShenVo();
        vo.setTaiYuanZhuXing(taiYuanZhuXing); // 胎元主星
        vo.setTaiXiZhuXing(taiXiZhuXing); // 胎息主星
        vo.setMingGongZhuXing(mingGongZhuXing); // 命宫主星
        vo.setShenGongZhuXing(shenGongZhuXing); // 身宫主星
        vo.setTaiYuanCangGan(taiYuanCangGan); // 胎元藏干
        vo.setTaiXiCangGan(taiXiCangGan); // 胎息藏干
        vo.setMingGongCangGan(mingGongCangGan); // 命宫藏干
        vo.setShenGongCangGan(shenGongCangGan); // 身宫藏干
        vo.setTaiYuanFuXing(taiYuanFuXing); // 胎元副星
        vo.setTaiXiFuXing(taiXiFuXing); // 胎息副星
        vo.setMingGongFuXing(mingGongFuXing); // 命宫副星
        vo.setShenGongFuXing(shenGongFuXing); // 身宫副星
        vo.setTaiYuanZiZuo(taiYuanZiZuo); // 胎元自坐
        vo.setTaiXiZiZuo(taiXiZiZuo); // 胎息自坐
        vo.setMingGongZiZuo(mingGongZiZuo); // 命宫自坐
        vo.setShenGongZiZuo(shenGongZiZuo); // 身宫自坐
        vo.setTaiYuanXingYun(taiYuanXingYun); // 胎元星运
        vo.setTaiXiXingYun(taiXiXingYun); // 胎息星运
        vo.setMingGongXingYun(mingGongXingYun); // 命宫星运
        vo.setShenGongXingYun(shenGongXingYun); // 身宫星运
        vo.setTaiYuanKongWang(taiYuanKongWang); // 胎元空亡
        vo.setTaiXiKongWang(taiXiKongWang); // 胎息空亡
        vo.setMingGongKongWang(mingGongKongWang); // 命宫空亡
        vo.setShenGongKongWang(shenGongKongWang); // 身宫空亡
        vo.setTaiYuanNaYin(taiYuanNaYin); // 胎元纳音
        vo.setTaiXiNaYin(taiXiNaYin); // 胎息纳音
        vo.setMingGongNaYin(mingGongNaYin); // 命宫纳音
        vo.setTaiYuanShenSha(taiYuanShenSha); // 胎元神煞
        vo.setShenGongNaYin(shenGongNaYin); // 身宫纳音
        vo.setTaiXiShenSha(taiXiShenSha); // 胎息神煞
        vo.setMingGongShenSha(mingGongShenSha); // 命宫神煞
        vo.setShenGongShenSha(shenGongShenSha); // 身宫神煞
        vo.setTaiYuanGanZhi(tanYuanGanZhi); // 胎元干支
        vo.setTaiXiGanZhi(tanXiGanZhi); // 胎息干支
        vo.setMingGongGanZhi(mingGongGanZhi); // 命宫干支
        vo.setShenGongGanZhi(shenGongGanZhi); // 身宫干支
        vo.setTianGanLiuYi(tianGanLiuYi); // 天干留意
        vo.setDiZhiLiuYi(diZhiLiuYi); // 地支留意

        // 5、返回数据
        return ResponseResult.result(ResponseResultEnum.SUCCESS, vo);

    }


}
